package accesoDatos;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;

import entidades.*;
public class adMaterias extends adDatos {
	  public void agregarMateria(Materia materia){
		  Connection oCnn = crearConexion();
		  //Creo el comando para ejecutar la sentencia SQL de INSERT
          //le asocio la conexion tambien

          StringBuilder sb = new StringBuilder();
          sb.append(" INSERT INTO materias( ");
          sb.append("     desc_materia, ");
          sb.append("     hs_semanales, ");
          sb.append("     hs_totales, ");
          sb.append("     id_plan ");
          sb.append(" ) ");
          sb.append(" VALUES( '");
          sb.append(     materia.getDescripcion()+"',");
          sb.append(    materia.getHsSemanales()+",");
          sb.append(    materia.getHsTotales()+",");
          sb.append(    materia.getIdPlan() );
          sb.append(" ); ");
	  
	  Statement cmdInsert;
		try {
			cmdInsert = oCnn.createStatement();
			cmdInsert.executeUpdate(sb.toString());
			oCnn.close();

		}catch (SQLException e) {
			e.printStackTrace();
			System.out.println("ERROR sql: No se pudo agregar la Materia.");

		}

	  }
	  public void borrarMateria(int id_materia){
	        Connection oCnn = crearConexion();
	        
	        StringBuilder sb = new StringBuilder();
	        sb.append(" DELETE FROM materias ");
            sb.append(" WHERE id_materia ="+ id_materia +";");
            Statement cmdDelete;
            try {
    			cmdDelete = oCnn.createStatement();
    			cmdDelete.executeUpdate(sb.toString());
    			oCnn.close();

    		}catch (SQLException e) {
    			e.printStackTrace();
    			System.out.println("ERROR sql: No se pudo borrar la persona.");

    		}
            
	  }
	  

      public void modificarMateria(Materia materia){
	        Connection oCnn = crearConexion();
	        StringBuilder sb = new StringBuilder();
            sb.append(" UPDATE materias ");
            sb.append(" SET  ");
            sb.append("     desc_materia = '"+materia.getDescripcion()+"',");
            sb.append("     hs_semanales = "+materia.getHsSemanales()+",");
            sb.append("     hs_totales = "+ materia.getHsTotales()+",");
            sb.append("     id_plan = "+ materia.getIdPlan() );
            sb.append(" WHERE id_materia = "+ materia.getId()+";");
            Statement cmdUpdate;
            try {
    			cmdUpdate = oCnn.createStatement();
    			cmdUpdate.executeUpdate(sb.toString());
    			oCnn.close();

    		}catch (SQLException e) {
    			e.printStackTrace();
    			System.out.println("ERROR sql: No se pudo updatear la persona.");

    		}
            
            

      
      }
      public Materia getMateria(int idMateria){
	        Connection oCnn = crearConexion();
            Materia materia;
	        materia = new Materia();

            String sql = "SELECT * FROM materias WHERE id_materia = "+idMateria+";";
            Statement cmdSelect;
            try{
            	 cmdSelect = oCnn.createStatement();
            	ResultSet registro = cmdSelect.executeQuery(sql);
            	if (registro.next()==true){
            		registro.beforeFirst();
        	        
        	        while (registro.next()){
        	        materia.setId(registro.getInt("id_materia"));
        	        materia.setDescripcion(registro.getString("desc_materia"));
        	        materia.setHsSemanales(registro.getInt("hs_semanales"));
        	        materia.setHsTotales(registro.getInt("hs_totales"));
        	        materia.setIdPlan(registro.getInt("id_plan"));
        	        
        	        	
        	        }
            	}
            	

            }catch (SQLException e) {
            	e.printStackTrace();
            	System.out.println("ERROR: Select Materias.");
      	}
      return materia;
    }
      
      public ArrayList<Materia> recuperarTodas(){
    	  Connection oCnn = crearConexion();
          ArrayList<Materia> listaMaterias = new ArrayList<Materia>();
          Materia materia;

          StringBuilder sb = new StringBuilder();

          sb.append(" SELECT m.id_materia, m.desc_materia, m.hs_semanales, m.hs_totales, m.id_plan, p.desc_plan,es.desc_especialidad ");
          sb.append(" FROM materias m ");
          sb.append(" INNER JOIN planes p ON m.id_plan = p.id_plan ");
          sb.append(" INNER JOIN especialidades es on p.id_especialidad = es.id_especialidad" );// Linea agregada siguiendo la negrada que habia
          sb.append(" ORDER BY desc_especialidad;");//linea para q las ordene por especialidad
          Statement cmdSelect;
          try{
         	 cmdSelect = oCnn.createStatement();
         	ResultSet registro = cmdSelect.executeQuery(sb.toString());
         	if (registro.next()==true){
         		registro.beforeFirst();
     	        
     	        while (registro.next()){
     	        	materia = new Materia();
     	        	materia.setId(registro.getInt("m.id_materia"));
          	        materia.setDescripcion(registro.getString("m.desc_materia"));
          	        materia.setHsSemanales(registro.getInt("m.hs_semanales"));
          	        materia.setHsTotales(registro.getInt("m.hs_totales"));
          	        materia.setIdPlan(registro.getInt("m.id_plan"));	
          	        materia.setNombrePlan(registro.getString("p.desc_plan"));
     	        	materia.setNombreEspecialidad(registro.getString("desc_especialidad"));//linea extra tmb
          	        listaMaterias.add(materia);
     	        		}
          
    	  
         			}
          		}catch (SQLException e) {
          			e.printStackTrace();
          			System.out.println("ERROR: Select devolver materiasMaterias.");
          		}
          return listaMaterias;
      }

      public ArrayList<Materia> recuperarMateriasParaInscripcion(int id_persona){
    	  Connection oCnn = crearConexion();  
    	  ArrayList<Materia> listaMaterias = new ArrayList<Materia>();
          Materia materia;

          StringBuilder sb = new StringBuilder();

          //Recupero sólo las materias en las que el alumno no está inscripto
          sb.append(" SELECT m.id_materia, m.desc_materia, m.hs_semanales, m.hs_totales, m.id_plan, p.desc_plan ");
          sb.append(" FROM materias m ");
          sb.append(" INNER JOIN planes p ON m.id_plan = p.id_plan ");
          sb.append(" WHERE id_materia NOT IN ");
          sb.append(" ( ");
          sb.append("  SELECT c.id_materia ");
          sb.append("  FROM alumnos_inscripciones ai ");
          sb.append("  INNER JOIN cursos c ON ai.id_curso = c.id_curso ");
          sb.append("  WHERE ai.id_alumno = ");
          sb.append(id_persona);
          sb.append("  ) ");
          sb.append(" AND p.id_plan = ");
          sb.append(" ( ");
          sb.append("  SELECT p.id_plan ");
          sb.append("  FROM planes p ");
          sb.append("  INNER JOIN personas pe ON p.id_plan = pe.id_plan ");
          sb.append("  WHERE pe.id_persona = "); 
          sb.append(id_persona);
          sb.append("  ); ");
          
          
          Statement cmdSelect;
          
        	  try{
              	 cmdSelect = oCnn.createStatement();
              	ResultSet registro = cmdSelect.executeQuery(sb.toString());
              	if (registro.next()==true){
              		registro.beforeFirst();
          	        
          	        while (registro.next()){
          	        	materia = new Materia();
          	        	materia.setId(registro.getInt("m.id_materia"));
              	        materia.setDescripcion(registro.getString("m.desc_materia"));
              	        materia.setHsSemanales(registro.getInt("m.hs_semanales"));
              	        materia.setHsTotales(registro.getInt("m.hs_totales"));
              	        materia.setIdPlan(registro.getInt("m.id_plan"));	
              	        materia.setNombrePlan(registro.getString("p.desc_plan"));
              	        listaMaterias.add(materia);
       	        	
          	        	}
              		}
        	  	}catch (SQLException e) {
        			e.printStackTrace();
        			System.out.println("ERROR: Select devolver materiasMaterias.");
        	  		}
        	  return listaMaterias;
        			  
      
      }
      
      public ArrayList<MateriasCarrera> recuperarMateriasDeLaCarrera(int id_plan)
      {
    	  Connection oCnn = crearConexion();
    	  ArrayList<MateriasCarrera> listaMaterias = new ArrayList<MateriasCarrera>();
          MateriasCarrera materia;
          StringBuilder sb = new StringBuilder();

          //Recupero sólo las materias en las que el alumno no está inscripto
          sb.append(" SELECT m.id_materia, m.desc_materia, m.hs_totales, p.desc_plan, e.desc_especialidad, p.id_plan, e.id_especialidad ");
          sb.append(" FROM materias m ");
          sb.append(" INNER JOIN planes p ON m.id_plan = p.id_plan ");
          sb.append(" INNER JOIN especialidades e ON p.id_especialidad = e.id_especialidad ");
          sb.append(" WHERE p.id_plan = "); 
          sb.append(id_plan);
          sb.append(";");
          Statement cmdSelect;
    	  try{
           	 cmdSelect = oCnn.createStatement();
           	ResultSet registro = cmdSelect.executeQuery(sb.toString());
           	if (registro.next()==true){
           		registro.beforeFirst();
       	        
       	        while (registro.next()){
       	        	materia = new MateriasCarrera();
       	        	materia.setId(registro.getInt("m.id_materia"));
       	        	materia.setDescripcion(registro.getString("m.desc_materia"));
       	        	materia.setHsTotales(registro.getInt("m.hs_totales"));
       	        	materia.setNombrePlan(registro.getString("p.desc_plan"));
       	        	materia.setNombreEspecialidad(registro.getString("e.desc_especialidad"));
       	        	materia.setIdPlan(registro.getInt("p.id_plan"));
       	        	materia.setIdEspecialidad(registro.getInt("e.id_especialidad"));
       	        	listaMaterias.add(materia);
       	        	}
           	}
           	
          
      }catch (SQLException e) {
			e.printStackTrace();
			System.out.println("ERROR: Select devolver materiasCarrera.");
	  		}
    	  return listaMaterias;
      }
      
      public boolean estaAsociadaACurso(String idMateria){
    	  Connection oCnn = adDatos.crearConexion();
    	  String sql = "SELECT * FROM cursos WHERE id_materia = "+idMateria+";";
          Statement cmdSelect;
          boolean respuesta = false;
          try{
            	cmdSelect = oCnn.createStatement();
            	ResultSet registro = cmdSelect.executeQuery(sql);
            	if (registro.next()==true){
            		registro.beforeFirst();
            		respuesta = true;
            	}
    	  
      }catch (SQLException e) {
			e.printStackTrace();
			System.out.println("ERROR: Select materia aosicada.");
	  		}
      return respuesta;
      }




}